// 62. 不同路径
// 一个机器人位于一个 m x n 网格的左上角 （起始点在下图中标记为 “Start” ）。

// 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角（在下图中标记为 “Finish” ）。

// 问总共有多少条不同的路径？
// 输入：m = 3, n = 7
// 输出：28
// 思路：dp[i][j]=dp[i-1][j]+dp[i][j-1];
/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
 var uniquePaths = function(m, n) {
    const dp = Array(m).fill().map(item => Array(n))// 创建二维数组
    // let dp = new Array(m).fill(1).map(() => new Array(n).fill(1));
    for(let i=0;i<m;i++) {
        dp[i][0]=1;
    }
    for(let j=0;j<n;j++){
        dp[0][j]=1;
    }
    for(let i=1;i<m;i++){
        for(let j=1;j<n;j++){
            dp[i][j]=dp[i-1][j]+dp[i][j-1];
        }
    }
    return dp[m-1][n-1];
};

// 63. 不同路径 II
// 一个机器人位于一个 m x n 网格的左上角 （起始点在下图中标记为 “Start” ）。

// 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角（在下图中标记为 “Finish”）。

// 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径？

// 网格中的障碍物和空位置分别用 1 和 0 来表示。

// 示例 1：
// 输入：obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
// 输出：2
// 解释：3x3 网格的正中间有一个障碍物。
// 从左上角到右下角一共有 2 条不同的路径：
// 1. 向右 -> 向右 -> 向下 -> 向下
// 2. 向下 -> 向下 -> 向右 -> 向右
// 思路：与上一题大体一致，就是要判断是否有障碍，如果有，初始值为0，否则为1
// 有障碍物的时候，就结束本次循环

/**
 * @param {number[][]} obstacleGrid
 * @return {number}
 */
 var uniquePathsWithObstacles = function(obstacleGrid) {
    let m=obstacleGrid.length;
    let n=obstacleGrid[0].length;
    let dp=new Array(m).fill().map(()=>Array(n).fill(0))
    for (let i = 0; i < m && obstacleGrid[i][0] === 0; ++i) {//判断当前位置是否有障碍
        dp[i][0] = 1
    }
    for(let j=0;j<n&&obstacleGrid[0][j]==0;j++) dp[0][j]=1;

    for(let i=1;i<m;i++){
        for(let j=1;j<n;j++){
            if(obstacleGrid[i][j]==1) continue;//用continue 结束本次循环
            dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
    
    return dp[m-1][n-1];
};